package com.xiaoma.aes.util;

import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;


/**
 * 基础工具类
 * @author qyduan 2016-04-07
 */
public final class BaseUtil{
    
    
    /**
     * 无参
     */
    private BaseUtil(){}
    
    /**
     * 对象是否为空
     * @author qylei
     * @param object
     * @return boolean 2016-5-16 创建方法
     */
    public static boolean objectNotNull(Object object){
        return object != null;
    }
    
    /**
     * 字符串是否为空
     * @param string
     * @return boolean
     * @author qylei 2016-5-16 创建方法
     */
    public static boolean stringNotNull(String string){
        return string != null && !"".equals(string.trim());
    }
    
    /**
     * 用于angularjs提交空数据处理
     * @param string
     * @return boolean
     * @since 0.0.1
     * @author qylei 2016-5-24 创建方法
     */
    public static boolean stringNotDefine(String string){
        if((null == string) || ""
                .equals(string) || (string.trim().equals("") || ("undefined".equals(string) || "null".equals(string)))){
            return false;
        }
        return true;
    }
    
    /**
     * List是否为空判断
     * @param list
     * @return boolean
     * @author qylei 2016-5-16 创建方法
     */
    public static boolean listNotNull(List<?> list){
        return list != null && list.size() != 0;
    }
    
    /**
     * MAP是否为空判断
     * @param map
     * @return boolean
     * @author qylei 2016-5-16 创建方法
     */
    public static boolean mapNotNull(Map<?, ?> map){
        return map != null && !map.isEmpty();
    }
    

    /**
     * 字符串转INTEGER
     * @param string
     * @return Integer
     * @author qylei 2016-5-16 创建方法
     */
    public static Integer stringToInteger(String string) throws Exception{
        
        if(!stringNotNull(string)){
            
            return null;
        }
        
        return Integer.valueOf(string);
    }
    
    /**
     * 字符串转long
     * @param string
     * @return Long
     * @author qylei 2016-5-16 创建方法
     */
    public static Long stringToLong(String string){
        
        if(!stringNotNull(string)){
            
            return null;
        }
        
        return Long.valueOf(string);
        
    }
    
    /**
     * 字符串转short
     * @param string
     * @return Short
     * @author qylei 2016-5-16 创建方法
     */
    public static Short stringToShort(String string){
        
        if(!stringNotNull(string)){
            
            return null;
        }
        
        return Short.valueOf(string);
        
    }
    
    /**
     * 字符串转bigdecimal
     * @param string
     * @return BigDecimal
     * @author qylei 2016-5-16 创建方法
     */
    public static BigDecimal stringToBigDecimal(String string) throws Exception{
        
        if(!stringNotNull(string)){
            
            return null;
        }
        
        return new BigDecimal(string);
        
    }
    
    /**
     * integer转字符串
     * @param integer
     * @return String
     * @author qylei 2016-5-16 创建方法
     */
    public static String integerToString(Integer integer){
        
        if(!objectNotNull(integer)){
            
            return null;
        }
        
        return integer.toString();
        
    }
    
    /**
     * long转字符串
     * @param lon
     * @return String
     * @author qylei 2016-5-16 创建方法
     */
    public static String longToString(Long lon){
        
        if(!objectNotNull(lon)){
            
            return null;
        }
        
        return lon.toString();
        
    }
    
    /**
     * short转字符串
     * @param shortValue
     * @return String
     * @author qylei 2016-5-16 创建方法
     */
    public static String shortToString(Short shortValue){
        
        if(!objectNotNull(shortValue)){
            
            return null;
        }
        
        return shortValue.toString();
        
    }
    
    /**
     * bigdecimal转字符串
     * @param bigDecimal
     * @return String
     * @author qylei 2016-5-16 创建方法
     */
    public static String bigDecimalToString(BigDecimal bigDecimal){
        
        if(!objectNotNull(bigDecimal)){
            
            return null;
        }
        
        return bigDecimal.toString();
    }
    
    /**
     * 浮点数据转字符串
     * @param float1
     * @return String
     * @author qylei 2016-5-16 创建方法
     */
    public static String floatToString(Float float1){
        
        if(BaseUtil.objectNotNull(float1)){
            
            return float1.toString();
        }
        
        return null;
    }
    
    /**
     * 字符串转浮点
     * @param string
     * @return Float
     * @author qylei 2016-5-16 创建方法
     */
    public static Float stringToFloat(String string){
        
        if(!stringNotNull(string)){
            
            return null;
        }
        
        return new Float(string);
        
    }
    
    /**
     * set判断是否为空
     * @param set
     * @return boolean
     * @author qylei 2016-5-16 创建方法
     */
    public static boolean setNotNull(Set<?> set){
        return set != null && set.size() > 0;
    }
    
    /**
     * 比较两个Integer对象的int值是否相等
     * @param integer1
     * @param integer2
     * @return boolean
     * @author qylei
     */
    public static boolean integerEquals(Integer integer1, Integer integer2){
        if(integer1 != null && integer2 != null){
            return integer1.intValue() == integer2;
        }else{
            return false;
        }
    }
    
    /**
     * 字符串(null,"undefined","null")转换成""
     * @param string 字符串
     * @return empty字符串或者原字符串
     */
    public static String nullStringToEmpty(String string){
        if((null == string) || (string.trim().equals("") || ("undefined".equals(string) || "null".equals(string)))){
            return "";
        }
        return string;
    }
    
    
    /**
     * 将二进制转换成16进制字符串
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]){
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < buf.length; i++){
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if(hex.length() == 1){
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
    
    /**
     * 将16进制转换为二进制
     * @param hexStr 十六进制字符串
     * @return
     */
    public static byte [] parseHexStr2Byte(String hexStr){
        if(hexStr.length() < 1){
            return null;
        }
        byte [] result = new byte[hexStr.length() / 2];
        for(int i = 0; i < hexStr.length() / 2; i++){
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }
    
    /**
     * 复制数组
     * @param src
     * @param srcPos
     * @param dest
     * @param destPos
     * @param length
     */
    public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length){
        System.arraycopy(src, srcPos, dest, destPos, length);
    }
    
    /**
     * 是否是正整数，不包含0
     * @author maj
     * @param str
     * @return
     * @version 0.0.1
     * @since 0.0.1
     * @data 2018年3月28日 下午12:31:47
     */
    public static boolean isPositiveInteger(String str){
        if(!BaseUtil.stringNotNull(str)){
            return false;
        }
        Pattern pattern = Pattern.compile("^[1-9]\\d*$");
        return pattern.matcher(str).matches();
    }
    
    /**
     * 是否是正整数
     * @author maj
     * @param str
     * @return
     * @version 0.0.1
     * @since 0.0.1
     * @data 2018年11月11日 下午3:46:39
     */
    public static boolean isNumeric(String str){
        if(!BaseUtil.stringNotNull(str)){
            return false;
        }
        Pattern pattern = Pattern.compile("[0-9]*");
        return pattern.matcher(str).matches();
    }
    
    
    public static boolean isInt(String val){
        try{
            int parseInt = Integer.parseInt(val.trim());
            return parseInt >= 0;
        }catch(NumberFormatException e){
            return false;
        }
    }
    
    /**
     * 是否是double
     * @author maj
     * @param str
     * @return
     * @version 0.0.1
     * @since 0.0.1
     * @data 2018年10月30日 上午11:33:58
     */
    public static boolean isDouble(String str){
        if(!BaseUtil.stringNotNull(str)){
            return false;
        }
        try{
            Double.valueOf(str.trim());
        }catch(NumberFormatException e){
            return false;
        }
        return true;
    }
    
    
    /**
     * string串以指定表达式分开组装成list
     * @param str 字符串
     * @param regex 表达式或者字符
     * @return list集合
     * @author dengzr
     * @date 2016年10月31日 下午3:52:17
     */
    public static List<String> strToList(String str, String regex){
        String temp = str;
        if(!BaseUtil.stringNotDefine(str)){
            temp = "ALL";
        }
        return Arrays.asList(temp.split(regex));
    }
    
    /**
     * 功能描述：获取本机IP
     * @return String
     * @author：Gine
     * @date：2015年6月3日
     */
    
    public static String obtainLocalIP(){
        try{
            return InetAddress.getLocalHost().getHostAddress();
        }catch(UnknownHostException e){
            return null;
        }
    }
    
}
